//#include "../include/ffmpeg_encoder.h"
//
//FFmpegEncoder::FFmpegEncoder(int p_width, int p_height, AVCodecID p_video_codec) :
//	width(p_width),
//	height(p_height),
//	video_codec(p_video_codec),
//	pFormatCtx(NULL),
//	video_st(NULL),
//	pCodecCtx(NULL),
//	pCodec(NULL),
//	picture_buf(NULL),
//	pFrame(NULL),
//	frame_idx(0)
//{
//}
//
//FFmpegEncoder::~FFmpegEncoder() {
//}
//
//bool FFmpegEncoder::init() {
//	av_register_all();
//	pFormatCtx = avformat_alloc_context();
//	video_st = avformat_new_stream(pFormatCtx, 0);
//
//	pCodecCtx = video_st->codec;
//	//pCodecCtx->codec_id = AV_CODEC_ID_HEVC;
//	pCodecCtx->codec_id = video_codec;
//	pCodecCtx->codec_type = AVMEDIA_TYPE_VIDEO;
//	pCodecCtx->pix_fmt = AV_PIX_FMT_YUV420P;
//	pCodecCtx->width = width;
//	pCodecCtx->height = height;
//	pCodecCtx->bit_rate = 400000;
//	pCodecCtx->gop_size = 250;
//
//	pCodecCtx->time_base.num = 1;
//	pCodecCtx->time_base.den = 25;
//
//	//H264
//	pCodecCtx->me_range = 16;
//	pCodecCtx->max_qdiff = 4;
//	pCodecCtx->qcompress = 0.6;
//	pCodecCtx->qmin = 10;
//	pCodecCtx->qmax = 51;
//
//	//Optional Param
//	pCodecCtx->max_b_frames = 3;
//
//	// Set Option
//	AVDictionary *param = 0;
//	//H.264
//	if (pCodecCtx->codec_id == AV_CODEC_ID_H264) {
//		av_dict_set(&param, "preset", "slow", 0);
//		av_dict_set(&param, "tune", "zerolatency", 0);
//	}
//
//	pCodec = avcodec_find_encoder(pCodecCtx->codec_id);
//	if (!pCodec) {
//		printf("Can not find encoder! \n");
//		return false;
//	}
//	if (avcodec_open2(pCodecCtx, pCodec, &param) < 0) {
//		printf("Failed to open encoder! \n");
//		return false;
//	}
//
//	pFrame = av_frame_alloc();
//	int picture_size = avpicture_get_size(pCodecCtx->pix_fmt, pCodecCtx->width,
//			pCodecCtx->height);
//	picture_buf = (uint8_t *) av_malloc(picture_size);
//	avpicture_fill((AVPicture *) pFrame, picture_buf, pCodecCtx->pix_fmt,
//			pCodecCtx->width, pCodecCtx->height);
//
//	av_new_packet(&pkt, picture_size);
//
//	return true;
//}
//
//bool FFmpegEncoder::encodeFrame(unsigned char* yuv_data, EncodeBuffer& encode_buf) {
//
//	picture_buf = yuv_data;
//	int y_size = pCodecCtx->width * pCodecCtx->height;
//
//	pFrame->data[0] = picture_buf;              // Y
//	pFrame->data[1] = picture_buf + y_size;      // U
//	pFrame->data[2] = picture_buf + y_size * 5 / 4;  // V
//
//	pFrame->pts = frame_idx * (video_st->time_base.den)
//					/ ((video_st->time_base.num) * 25);
//
//	int got_picture = 0;
//	//Encode
//	int ret = avcodec_encode_video2(pCodecCtx, &pkt, pFrame, &got_picture);
//	if (ret < 0) {
//		printf("Failed to encode! \n");
//		return false;
//	}
//
//	encode_buf.encode_data = new unsigned char[pkt.size];
//	memcpy(encode_buf.encode_data, pkt.data, pkt.size);
//	encode_buf.encode_size = pkt.size;
//
//	frame_idx++;
//	return true;
//}
//
//bool FFmpegEncoder::flush(vector<EncodeBuffer>& encode_bufs) {
//	//Flush Encoder
//	int ret;
//	int got_frame;
//	AVPacket enc_pkt;
//	if (!(pFormatCtx->streams[0]->codec->codec->capabilities &
//	CODEC_CAP_DELAY))
//		return false;
//	while (1) {
//		enc_pkt.data = NULL;
//		enc_pkt.size = 0;
//		av_init_packet(&enc_pkt);
//		ret = avcodec_encode_video2(pFormatCtx->streams[0]->codec,
//				&enc_pkt,
//				NULL, &got_frame);
//		av_frame_free(NULL);
//		if (ret < 0)
//			break;
//		if (!got_frame) {
//			ret = 0;
//			break;
//		}
//		EncodeBuffer encode_buf;
//		encode_buf.encode_data = enc_pkt.data;
//		encode_buf.encode_size = enc_pkt.size;
//		encode_bufs.push_back(encode_buf);
////		printf("Flush Encoder: Succeed to encode 1 frame!\tsize:%5d\n",
////				enc_pkt.size);
//	}
//
//	if (ret < 0) {
//		printf("Flushing encoder failed\n");
//		return false;
//	}
//	return true;
//}
//
//void FFmpegEncoder::close() {
//	if (video_st) {
//		avcodec_close(video_st->codec);
//		av_free(pFrame);
//		av_free(picture_buf);
//	}
//	avio_close(pFormatCtx->pb);
//	avformat_free_context(pFormatCtx);
//}
//
